package com.xp.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xp.entity.Role;
import com.xp.entity.UserRole;
import com.xp.utils.Result;

import java.util.List;

/**
 * 角色服务接口
 * 
 * @author xp
 * @since 2024-01-01
 */
public interface RoleService extends BaseService<Role> {

    /**
     * 分页查询角色列表
     * 
     * @param page 分页参数
     * @param roleName 角色名称（可选）
     * @param status 状态（可选）
     * @return 角色分页结果
     */
    Result<IPage<Role>> getRolePage(Page<Role> page, String roleName, Integer status);

    /**
     * 新增角色
     * 
     * @param role 角色信息
     * @return 操作结果
     */
    Result<Object> createRole(Role role);

    /**
     * 更新角色
     * 
     * @param role 角色信息
     * @return 操作结果
     */
    Result<Object> updateRole(Role role);

    /**
     * 删除角色
     * 
     * @param roleId 角色ID
     * @return 操作结果
     */
    Result<Object> deleteRole(Long roleId);

    /**
     * 根据ID获取角色详情
     * 
     * @param roleId 角色ID
     * @return 角色信息
     */
    Result<Role> getRoleById(Long roleId);

    /**
     * 获取所有启用的角色
     * 
     * @return 角色列表
     */
    Result<List<Role>> getEnabledRoles();

    /**
     * 根据用户ID获取用户的角色列表
     * 
     * @param userId 用户ID
     * @return 角色列表
     */
    Result<List<Role>> getRolesByUserId(Long userId);

    /**
     * 为用户分配角色
     * 
     * @param userId 用户ID
     * @param roleIds 角色ID列表
     * @return 操作结果
     */
    Result<Object> assignRolesToUser(Long userId, List<Long> roleIds);

    /**
     * 移除用户的角色
     * 
     * @param userId 用户ID
     * @param roleId 角色ID
     * @return 操作结果
     */
    Result<Object> removeUserRole(Long userId, Long roleId);

    /**
     * 获取用户角色关联列表
     * 
     * @param userId 用户ID（可选）
     * @param roleId 角色ID（可选）
     * @return 用户角色关联列表
     */
    Result<List<UserRole>> getUserRoleList(Long userId, Long roleId);

    /**
     * 更新角色状态
     * 
     * @param roleId 角色ID
     * @param status 状态（0-禁用，1-启用）
     * @return 操作结果
     */
    Result<Object> updateRoleStatus(Long roleId, Integer status);

    /**
     * 为角色分配用户
     * 
     * @param roleId 角色ID
     * @param userIds 用户ID列表
     * @return 操作结果
     */
    Result<Object> assignUsersToRole(Long roleId, List<Long> userIds);
}